package com.fate.framework.handler;

import java.sql.*;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

/**
 * 泛型类型处理程序，处理 PostgreSQL 的 character varying[] 类型的 List。
 *
 * @param <T> 要处理的列表的元素类型
 */
public class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType)
      throws SQLException {
    // 将 List 转换为数组
    ps.setArray(i, ps.getConnection().createArrayOf("varchar", parameter.toArray()));
  }

  @Override
  public List<T> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
    return getList(resultSet.getArray(columnName));
  }

  @Override
  public List<T> getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
    return getList(resultSet.getArray(columnIndex));
  }

  @Override
  public List<T> getNullableResult(CallableStatement callableStatement, int columnIndex)
      throws SQLException {
    return getList(callableStatement.getArray(columnIndex));
  }

  private List<T> getList(Array array) throws SQLException {
    if (array == null) {
      return null;
    }
    // 将 SQL Array 转换为 Java List
    @SuppressWarnings("unchecked")
    T[] arrayItems = (T[]) array.getArray();
    return Arrays.asList(arrayItems);
  }
}
